class Solution309 {
    public int maxProfit(int[] prices) {
      int n = prices.length ;

      // 状态表示 : 在第i天结束 ,处于 j 种情况下 的最大利润
      // 0 : 买入 , 1:卖出 , 2:冷冻期
      int[][] dp = new int[n][3] ;
      dp[0][0] = -prices[0] ;
      for(int i=1 ; i < n ; i ++){
         dp[i][0] = Math.max(dp[i-1][0] , dp[i-1][2] - prices[i]) ;
         dp[i][1] = Math.max(dp[i-1][1] , dp[i-1][0] + prices[i]) ; 
         dp[i][2] = Math.max(dp[i-1][1] , dp[i-1][2]) ; 
      }
      return Math.max(dp[n-1][1] , dp[n-1][2]) ;
    }
}